`ifndef ALU16_V
`define ALU16_V

`include "Add16.v"
`include "xor.v"

module ALU16(
    input [15:0] a, b,
    input sub,           // 0=加法, 1=减法
    output [15:0] result,
    output cout,         // 进位输出
    output overflow      // 溢出标志
);
    
    wire [15:0] b_xor;   // 经过XOR处理的b
    wire add_cout;       // 加法器的进位输出
    
    // 对b的每一位进行XOR操作（减法时取反）
    Xor xor0(b[0], sub, b_xor[0]);
    Xor xor1(b[1], sub, b_xor[1]);
    Xor xor2(b[2], sub, b_xor[2]);
    Xor xor3(b[3], sub, b_xor[3]);
    Xor xor4(b[4], sub, b_xor[4]);
    Xor xor5(b[5], sub, b_xor[5]);
    Xor xor6(b[6], sub, b_xor[6]);
    Xor xor7(b[7], sub, b_xor[7]);
    Xor xor8(b[8], sub, b_xor[8]);
    Xor xor9(b[9], sub, b_xor[9]);
    Xor xor10(b[10], sub, b_xor[10]);
    Xor xor11(b[11], sub, b_xor[11]);
    Xor xor12(b[12], sub, b_xor[12]);
    Xor xor13(b[13], sub, b_xor[13]);
    Xor xor14(b[14], sub, b_xor[14]);
    Xor xor15(b[15], sub, b_xor[15]);
    
    // 减法时需要加1（二补数），所以cin = sub
    Add16 adder(
        .a(a),
        .b(b_xor),
        .cin(sub),           // 减法时cin=1，加法时cin=0
        .sum(result),
        .cout(add_cout)
    );
    
    assign cout = add_cout;
    
    // 溢出检测：
    // 对于加法：当两个正数相加得到负数，或两个负数相加得到正数时发生溢出
    // 对于减法：当正数减负数得到负数，或负数减正数得到正数时发生溢出
    // 简化的溢出检测：检查操作数符号位和结果符号位
    wire a_sign, b_sign, result_sign;
    wire effective_b_sign; // 减法时b的有效符号位（取反后的）
    
    assign a_sign = a[15];
    assign b_sign = b[15];
    assign result_sign = result[15];
    assign effective_b_sign = sub ? ~b_sign : b_sign;
    
    // 溢出条件：输入操作数符号相同，但结果符号不同
    assign overflow = (a_sign == effective_b_sign) && (a_sign != result_sign);
    
endmodule

`endif
